package com.dingding.manager.modules.system.dao.impl;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.apache.log4j.Logger;
import org.springframework.stereotype.Component;

import com.dingding.manager.common.beans.sys.SysUser;
import com.dingding.manager.common.beans.sys.SysUserRole;
import com.dingding.manager.common.dao.Db;
import com.dingding.manager.common.dao.Page;
import com.dingding.manager.core.shiro.ShiroKit;
import com.dingding.manager.core.shiro.ShiroUser;
import com.dingding.manager.core.util.ToolUtil;
import com.dingding.manager.modules.system.dao.UserDao;
import com.dingding.manager.modules.system.dto.user.ReqUserListDTO;
import com.dingding.manager.modules.system.dto.user.ResUserDTO;
import com.dingding.manager.modules.system.dto.user.UserInfo;
import com.dingding.manager.modules.system.sql.UserSQL;

/**
 * 
* @ClassName: UserDaoImpl 
* @Description: 用户管理dao实现类
* @author SUNZHICHENG 
* @date 2016年12月1日 下午1:44:23 
* @version V2.6.2
 */
@Component("userDao")
public class UserDaoImpl implements UserDao {
	
	private static Logger logger=Logger.getLogger(UserDaoImpl.class);
	
	/**
	 * @Description: 根据用户id查询用户详情             
	 * @date 2016年12月1日 下午2:08:23
	 * @author SUNZHICHENG 
	 * @since V2.6.2
	 */
	@Override
	public ResUserDTO getUserById(Integer userId) {
		return Db.querySqlFirst(ResUserDTO.class, UserSQL.QUERY_USER_BYID, userId);
	}

	/**
	 * @Description: 根据用户名获取用户信息
	 * @param name 用户名     
	 * @date 2016年12月2日 下午3:10:51
	 * @author SUNZHICHENG 
	 * @since V2.6.2
	 */
	
	public SysUser getUserByName(String name) {		
			return Db.querySqlFirst(SysUser.class, UserSQL.QUERY_USER_BY_NAME, name);		
	}
	
	/**
	 * @Description:根据用户名获取用户常用信息       
	 * @date 2016年12月4日 下午5:17:44
	 * @author SUNZHICHENG 
	 * @since V2.6.2
	 */
	@Override
	public UserInfo getUserInfoByName(String name) {
		return Db.querySqlFirst(UserInfo.class, UserSQL.QUERY_USERINFO_BY_NAME, name);
		
	}

	/**
	 * @Description: 删除用户信息
	 * @param userId 用户id       
	 * @date 2016年12月1日 下午2:33:16
	 * @author SUNZHICHENG 
	 * @since V2.6.2
	 */
	@Override
	public boolean deleteUser(Integer userId) {	
		//获取当前登录用户信息
		ShiroUser shiroUser = ShiroKit.getUser();
		Integer currentId=shiroUser.getId();
		SysUser user=Db.findById(userId, SysUser.class);
		if (user!=null) {
			// 0 ：未删除 1： 已删除
			user.setDelFlag(1);
			user.setUpdateUserId(currentId);
			user.setUpdateTime(new Date());
			Db.saveOrUpdate(user);
			return true;
		}
		return false;
		
		
	}
	
	/**
	 * @Description: 修改用户是否可用的状态
	 * @param userId  用户id      
	 * @date 2016年12月1日 下午2:30:19
	 * @author SUNZHICHENG 
	 * @since V2.6.2
	 */
	@Override
	public boolean ModifyUserState(Integer userId,Integer state) {
		//获取当前登录用户信息
		ShiroUser shiroUser = ShiroKit.getUser();
		Integer currentId=shiroUser.getId();
		SysUser user = Db.findById(userId, SysUser.class);
		if (user!=null) {
			user.setUserStatus(state);
			user.setUpdateUserId(currentId);
			user.setUpdateTime(new Date());
			Db.saveOrUpdate(user);
			return true;
		}
		return false;
		
	}

	/**
	 * @Description: 查询所有用户列表或按照条件查询用户列表
	 * @param condition  查询条件 （此条件可为空）      
	 * @date 2016年12月1日 下午2:11:26
	 * @author SUNZHICHENG 
	 * @since V2.6.2
	 */
	@Override
	public Page<ResUserDTO> getUserList(ReqUserListDTO reqUserListDTO,Integer start, Integer length) {
		
		StringBuffer sql=new StringBuffer(" SELECT	a.sysUserId  sysUserId,	a.loginName  loginName,	a.`password` 'password',  a.trueName trueName,	"
				+ " a.phone phone, a.loginIp loginIp,	DATE_FORMAT(a.loginTime,'%Y-%m-%d %H:%I:%S') loginTime, a.userStatus userStatus,	"
				+ " a.createUserId createUserId,	DATE_FORMAT(a.createTime,'%Y-%m-%d %H:%I:%S') createTime,	a.updateUserId updateUserId, "
				+ "	DATE_FORMAT(a.updateTime,'%Y-%m-%d %H:%I:%S') updateTime,a.remarks ,   d.`organizationId` organizationId, d.cityName cityName,  d.organizationName organizationName, d.`organizationType` organizationType, "
				+ "	c.`sysRoleId`  sysRoleId, c.roleName roleName,	c.roleEnName roleEnName FROM	dd_sys_user a,	dd_sys_user_role b,	dd_sys_role c,"
				+ "	dd_organization d WHERE	a.sysUserId = b.sysUserId AND b.sysRoleId = c.sysRoleId AND a.companyId = d.organizationId AND a.delFlag = 0  ");
		//参数集合
		List<Object> params=new ArrayList<Object>();
		
		if (reqUserListDTO !=null) {
			
			//登录名、姓名、电话号码
			if (ToolUtil.isNotEmpty(reqUserListDTO.getCondition())) {
				sql.append(" AND (a.loginName LIKE ? OR a.trueName LIKE ? OR a.phone LIKE ? ) ");
				params.add("%"+reqUserListDTO.getCondition()+"%");
				params.add("%"+reqUserListDTO.getCondition()+"%");
				params.add("%"+reqUserListDTO.getCondition()+"%");
			}
			
			//机构类型(0：总公司 如果是总公司，则查询所有的)
			if (ToolUtil.isNotEmpty(reqUserListDTO.getOrganizationType()) && reqUserListDTO.getOrganizationType()!=0) {
				sql.append(" AND d.organizationType = ?  ");
				params.add(reqUserListDTO.getOrganizationType());
			}
			//机构编码
			if (ToolUtil.isNotEmpty(reqUserListDTO.getOrganizationId())) {
				sql.append(" AND d.organizationId = ?  ");
				params.add(reqUserListDTO.getOrganizationId());
			}
			
		}
		sql.append(" ORDER BY a.createTime desc  ");
		Integer row =(int) Math.ceil((double)(start+1)/length);
		Page<ResUserDTO> page=new Page<>(row, length);
		return Db.querySqlByPage(ResUserDTO.class, page, sql.toString(), params.toArray());
	}
	
	/**
	 * @Description: 添加用户
	 * @date 2016年12月8日 上午11:29:04
	 * @author SUNZHICHENG 
	 * @since V2.6.2
	 */
	@Override
	public boolean addUser(SysUser user) {
		Db.saveOrUpdate(user);
		return false;
	}
	
	/**
	 * @Description:添加用户角色关联
	 * @date 2016年12月8日 下午1:58:21
	 * @since V2.6.2
	 */
	@Override
	public void addUserRole(SysUserRole sysUserRole) {
		Db.saveOrUpdate(sysUserRole);
	}
	
	/**
	 * @Description: 删除用户与角色管理关系
	 * @date 2016年12月8日 下午2:43:47
	 * @author SUNZHICHENG 
	 * @since V2.6.2
	 */
	@Override
	public boolean deleteUserRole(Integer sysRoleId) {
		//获取用户角色列表
		List<SysUserRole> userRoleList = Db.querySqlList(SysUserRole.class, UserSQL.QUERY_USER_ROLE, sysRoleId);
		for (SysUserRole sysUserRole : userRoleList) {
			Db.delete(sysUserRole);			
		}		
		return true;
	}
	
	/**
	 * @Description: 根据用户名获取用户（判断用户是否存在）
	 * @date 2016年12月8日 下午10:32:45
	 * @author SUNZHICHENG 
	 * @since V2.6.2
	 */
	@Override
	public List<SysUser> getUsers(String name) {
		return Db.querySqlList(SysUser.class, UserSQL.USER_BY_NAME, name);
	}
	
	/**
	 * @Description: 根据id获取用户信息
	 * @date 2016年12月15日 下午3:18:50
	 * @author SUNZHICHENG 
	 * @since V2.6.2
	 */
	@Override
	public SysUser getSysUserById(Integer sysRoleId) {
		return Db.findById(sysRoleId, SysUser.class);
	}
	
	

}
